package com.zj.cman.utils;

import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.security.Key;
import java.util.Base64;

/**
 * 密钥生成器工具类，用于生成安全的 JWT 签名密钥。
 */
public class KeyGeneratorUtil {

    /**
     * 生成一个安全的 HMAC-SHA 密钥
     *
     * @return 生成的密钥
     */
    public static SecretKey generateHmacShaKey() {
        // 使用 Keys.secretKeyFor 生成一个安全的随机密钥
        return Keys.secretKeyFor(io.jsonwebtoken.SignatureAlgorithm.HS256);
    }

    /**
     * 将密钥转换为 Base64 编码的字符串
     *
     * @param key 密钥
     * @return Base64 编码的密钥字符串
     */
    public static String keyToBase64(Key key) {
        // 将密钥的字节数组转换为 Base64 编码的字符串
        return Base64.getEncoder().encodeToString(key.getEncoded());
    }

    /**
     * 从 Base64 编码的字符串中还原密钥
     *
     * @param base64Key Base64 编码的密钥字符串
     * @return 还原后的密钥
     */
    public static SecretKey base64ToKey(String base64Key) {
        // 将 Base64 编码的字符串解码为字节数组
        byte[] keyBytes = Base64.getDecoder().decode(base64Key);
        // 使用字节数组生成密钥
        return Keys.hmacShaKeyFor(keyBytes);
    }

    public static void main(String[] args) {
        // 生成一个 HMAC-SHA 密钥
        SecretKey key = generateHmacShaKey();
        System.out.println("Generated Key: " + key);

        // 将密钥转换为 Base64 编码的字符串
        String base64Key = keyToBase64(key);
        System.out.println("Base64 Encoded Key: " + base64Key);

        // 从 Base64 编码的字符串中还原密钥
        SecretKey restoredKey = base64ToKey(base64Key);
        System.out.println("Restored Key: " + restoredKey);

        // 验证原始密钥和还原后的密钥是否相同
        System.out.println("Is Key Restored Correctly? " + key.equals(restoredKey));
    }
}